import axios from 'axios';
import type { AxiosInstance, AxiosRequestConfig, AxiosResponse, AxiosError } from 'axios';
import { ElMessage } from 'element-plus';
import router from "@/router";

// 定义 API 响应数据的类型
export interface ApiResponse<T> {
    code: number;
    data?: T;
    message?: string;
}

// 基础配置
const BASE_URL = 'http://localhost:8101/api';
const TIMEOUT = 30000; // 请求超时时间

// 创建 Axios 实例并配置基础 URL、超时时间和凭证
const request: AxiosInstance = axios.create({
    baseURL: BASE_URL,
    timeout: TIMEOUT,
    withCredentials: true, // 确保请求携带 session
    // headers: { 'Content-Type': 'application/json' },
    headers: { 'Content-Type': 'application/json' },
});

// 请求拦截器
request.interceptors.request.use(
    (config: any) => {
        // 这里可以添加请求前的处理逻辑，比如添加token等
        return config;
    },
    (error: AxiosError) => {
        ElMessage.error("请求发送失败，请稍后再试");
        return Promise.reject(error);
    }
);

// 响应拦截器
request.interceptors.response.use(
    // @ts-ignore
    (response: AxiosResponse<ApiResponse<any>>) => {
        const res = response.data;

        // 检查 code 是否为成功状态码
        if (res.code !== 2000) {
            if (res.code === 40100) {
                ElMessage.error('未登录，请先登录');
                router.push('/login');
            } else {
                ElMessage.error(res.message || '服务器返回错误');
            }
            // 抛出错误而不是返回 null
            throw new Error(res.message || '请求失败');
        }
        // 直接返回响应的 data 部分
        return res; // 只返回数据部分
    },
    (error: AxiosError) => {
        let errorMessage: string;
        if (error.response) {
            const { status } = error.response;
            switch (status) {
                case 401:
                    errorMessage = '未登录或登录已过期，请重新登录';
                    break;
                case 403:
                    errorMessage = '权限不足，无法访问该资源';
                    break;
                case 404:
                    errorMessage = '请求的资源未找到';
                    break;
                case 500:
                    errorMessage = '服务器内部错误，请稍后重试';
                    break;
                default:
                    errorMessage = `服务器返回错误状态码：${status}`;
            }
        } else if (error.request) {
            errorMessage = '请求已发出，但没有收到响应，请检查您的网络连接';
        } else {
            errorMessage = `请求出错：${error.message || '未知错误'}`;
        }

        ElMessage.error(errorMessage);
        if (error.response?.status === 401) {
            router.push('/login');
        }

        return Promise.reject(error);
    }
);

export default request;
